﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Web.Caching;
using System.Web;

namespace DocManagerORM.Caching
{
    public class CacheDati<Ret> : CacheBase,IRefresh //where T : class,new() 
    {
        
        //public CacheDati(IQueryable<T> pQueryDati, string pKey, int pMinutiDiValidità, CacheItemPriority pPriorità)
        //{           
        //    QueryDati = pQueryDati;
        //    KeyDati = pKey;
        //    MinutiDiValiditàCache = pMinutiDiValidità;
        //    Priorità = pPriorità;
         
        //    RefreshCache();
        //}

        public CacheDati(Func<Ret> pAzione, string pKey, int pMinutiDiValidità, CacheItemPriority pPriorità)
        {
            if (_DictCache.ContainsKey(pKey))
            {
                throw new ArgumentException("Chiave in cache già esistente !");
                return;
            }

            _DictCache.Add(pKey, this); 
            
            KeyDati = pKey;
            MinutiDiValiditàCache = pMinutiDiValidità;
            Priorità = pPriorità;
            Azione = pAzione;

            Refresh();
        }

        public Ret RisultatoAzione { get; set; }
             
       public Func<Ret> Azione { get; set; }
      
       public  void Refresh()
       {
           if (Azione != null)
           {
               RisultatoAzione = Azione();
                
               CacheDati.Remove(KeyDati);
               CacheDati.Add(KeyDati, RisultatoAzione, null, DateTime.UtcNow.AddMinutes(MinutiDiValiditàCache), Cache.NoSlidingExpiration, Priorità,
                  RemovedCallback);
           }
           else
           {
               //var datiList = QueryDati.ToList();
               //CacheDati.Add(KeyDati, datiList, null, DateTime.UtcNow.AddMinutes(MinutiDiValiditàCache), Cache.NoSlidingExpiration, Priorità,
               //   RemovedCallback);

           }
       }

       public Ret CacheData { get { return  (Ret) CacheDati.Get(KeyDati); } }

       private void RemovedCallback(string key, object value, CacheItemRemovedReason callbackreason)
       {
           Refresh();
       }


       public string KeyDati { get; set; }

       public CacheItemPriority Priorità { get; set; }

       public int MinutiDiValiditàCache { get; set; }

       public DateTime TimeUltimoPrelievoDati { get; set; }

             

      
    }//fC
}
